/**
 * 指定物理内存区域的接口。
 * 
 * 物理内存可能不是连续的，此时就需要用多个内存区域来表达整个可用的内存空间。
 */

#include <mm/physical_area.h>

/* 储存内存区域物理起始地址的数组。 */
static unsigned long __areas_physical_start[MAX_PHYSICAL_AREAS] = { 0 };
/* 储存内存区域长度的数组。 */
static unsigned long __areas_length[MAX_PHYSICAL_AREAS] = {0};
/* 用于计数已经添加的内存区域数量。 */
static unsigned long __areas_count = 0;


int add_physical_area(
    unsigned long physical_start, 
    unsigned long area_length
)
{
    if (__areas_count >= MAX_PHYSICAL_AREAS) {
        /// 添加了过多内存区域。
        return -1;
    }
    if (__areas_count > 0 && 
        __areas_physical_start[__areas_count - 1] >= physical_start
    ) {
        /// 内存区域添加顺序错误。
        return -1;
    }

    __areas_physical_start[__areas_count] = physical_start;
    __areas_length[__areas_count] = area_length;
    __areas_count++;
    return 0;
}

int get_physical_area(
    unsigned long area_num, 
    unsigned long *physical_start, 
    unsigned long *area_length
)
{
    if (area_num >= __areas_count) {
        return 0;
    }

    *physical_start = __areas_physical_start[area_num];
    *area_length = __areas_length[area_num];
    return 1;
}

unsigned long get_physical_areas_count(void)
{
    return __areas_count;
}
